package com.evol.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.evol.domain.AjaxResult;
import com.evol.domain.frp.UserInfo;
import com.evol.util.EvolTool;
import com.evol.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 *  用户管理service
 * @author EvOL
 * @description
 * @date 2024-06-03 10:34
 **/
@Service
public class TokenService {
    @Autowired
    private JsonFileService jsonFileService;
    private static Map<String, UserInfo> tokens = new HashMap<>();
    @PostConstruct
    public void init() {
        String data=jsonFileService.readJsonFileAsString(EvolTool.USERLIST);
        if(StringUtils.isNotEmpty(data)){
            JSONArray array=JSONArray.parseArray(data);
            for(int i=0;i<array.size();i++){
                UserInfo userInfo=JSON.parseObject(array.getJSONObject(i).toJSONString(),UserInfo.class);
                tokens.put(userInfo.getUser(),userInfo );
            }
            System.out.printf("init tokens size:%s",array.size());
        }
    }
    /**
     * 从缓存读取用户信息
     * @param user
     * @return
     */
    public UserInfo getToken(String user){
        return tokens.get(user);
    }
    public int getTokenSize(){
        return tokens.size();
    }
    /**
     * 查询用户信息
     * @param username
     * @param token
     * @param comment
     * @param page
     * @param size
     * @return
     */
    public List<UserInfo> getUsers(String username, String token,String comment, int page, int size){
        return tokens.values().stream()
                .filter(userInfo -> (StringUtils.isEmpty(username) || userInfo.getUser().contains(username)) &&
                                        (StringUtils.isEmpty(token) || userInfo.getToken().contains(token)) &&
                                                (StringUtils.isEmpty(comment) || userInfo.getComment().equals(comment))
                        )
                .skip((page - 1) * size)
                .limit(size)
                .collect(Collectors.toList());
    }
    public AjaxResult addUserinfo(UserInfo userInfo) {
        if(StringUtils.isEmpty(userInfo.getUser())){
            return AjaxResult.error("用户名不允许为空！");
        }
        if(getToken(userInfo.getUser())!=null){
           return AjaxResult.error("用户已经存在！");
        }
        userInfo.setEnable(true);
        // 校验用户信息
        if(!checkUserinfo(userInfo).isSuccess()){
            return checkUserinfo(userInfo);
        }

        tokens.put(userInfo.getUser(),userInfo);
        saveUserinfo();
        return AjaxResult.success();
    }
    public AjaxResult updUserinfo(UserInfo userInfo,UserInfo userInfoold) {
        if(StringUtils.isEmpty(userInfo.getUser())){
            return AjaxResult.error("用户名不允许为空！");
        }
        if(getToken(userInfoold.getUser())==null){
            return AjaxResult.error("用户不存在！");
        }
        if(!userInfo.getUser().equals(userInfoold.getUser())){
            if(getToken(userInfo.getUser())!=null){
                return AjaxResult.error("用户已经存在！");
            }
        }
        // 校验用户信息
        if(!checkUserinfo(userInfo).isSuccess()){
            return checkUserinfo(userInfo);
        }

        tokens.put(userInfo.getUser(),userInfo);
        saveUserinfo();
        return AjaxResult.success();
    }
    public AjaxResult delUserinfo(String user) {
        if(getToken(user)==null){
            return AjaxResult.error("用户不存在！");
        }
        tokens.remove(user);
        saveUserinfo();
        return AjaxResult.success();
    }
    public AjaxResult updEnable(String user,boolean enable) {
        if(getToken(user)==null){
            return AjaxResult.error("用户不存在！");
        }
        UserInfo userInfo=getToken(user);
        userInfo.setEnable(enable);
        tokens.put(userInfo.getUser(),userInfo);
        saveUserinfo();
        return AjaxResult.success();
    }
    public AjaxResult checkUserinfo(UserInfo userInfo) {
        if(StringUtils.isEmpty(userInfo.getUser())){
            return AjaxResult.error("please input user account").put("code",5);
        }
        if(StringUtils.isEmpty(userInfo.getToken())){
            return AjaxResult.error("token format error").put("code",5);
        }

        if((StringUtils.isEmpty(userInfo.getPorts())&&StringUtils.isEmpty(userInfo.getDomains()))
        ||StringUtils.isEmpty(userInfo.getPorts()[0])&&StringUtils.isEmpty(userInfo.getDomains()[0])){
            return AjaxResult.error("either port or domain name must be provided.");
        }
        return AjaxResult.success();
    }
    /**
     * 更新存储
     */
    private void saveUserinfo(){
        JSONArray jsonArray = new JSONArray();
        tokens.values().forEach(userInfo -> {
            jsonArray.add(userInfo);
        });
        jsonFileService.saveJsonFile(EvolTool.USERLIST,jsonArray.toJSONString());
    }
}
